package logica;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import logica.persistencia.IdentificadorPersistente;

public class Identificador {
	
	private List<Atributo> atributos;
	private List<Entidad> entidades;
	private String nombre;
	
	public Identificador()
	{
		this.setAtributos(new LinkedList<Atributo>());
		this.setEntidades(new LinkedList<Entidad>());
	}

	public void agregarAtributoIdentificador(Atributo identificador) throws AtributoRepetidoException
	{
		verificarSiAtributoRepetido(identificador);
		this.getAtributos().add(identificador);
	}

	public void agregarAtributosIdentificadores(List<Atributo> identificador) throws AtributoRepetidoException
	{
		Iterator<Atributo> it = identificador.iterator();
		
		while (it.hasNext())
			this.agregarAtributoIdentificador(it.next());
	}
	
	public void agregarEntidadIdentificadora(Entidad identificador) throws IdExternoRepetidoException
	{
		verificarSiEntidadRepetida(identificador);
		this.getEntidades().add(identificador);
	}
	
	public void agregarEntidadesIdentificadoras(List<Entidad> identificador) throws IdExternoRepetidoException
	{
		Iterator<Entidad> it = identificador.iterator();
		
		while (it.hasNext())
			this.agregarEntidadIdentificadora(it.next());
	}
	
	private void verificarSiAtributoRepetido(Atributo atributo) throws AtributoRepetidoException 
	{
		Iterator<Atributo> iteradorAtributo = this.getAtributos().iterator();
		
		while (iteradorAtributo.hasNext()) 
		{
			if (atributo.equals(iteradorAtributo.next()))
				throw new AtributoRepetidoException("Una entidad no puede tener atributos con el mismo nombre. Ver: " + atributo);
		}
	}
	
	private void verificarSiEntidadRepetida(Entidad entidad) throws IdExternoRepetidoException 
	{
		Iterator<Entidad> iteradorEntidad = this.getEntidades().iterator();

		while (iteradorEntidad.hasNext()) 
		{
			if (entidad.equals(iteradorEntidad.next()))
				throw new IdExternoRepetidoException("Una entidad no puede tener identificadores externos repetidos. Ver: " + entidad);
		}
	}

	public IdentificadorPersistente getIdentificadorPersistente() {
		return new IdentificadorPersistente(this);
	}
	
	public List<Entidad> getEntidades() {
		return entidades;
	}

	public void setEntidades(List<Entidad> entidades) {
		this.entidades = entidades;
	}

	public List<Atributo> getAtributos() {
		return atributos;
	}

	public void setAtributos(List<Atributo> atributos) {
		this.atributos = atributos;
	}
	
	public void setToString(String nombre){
		this.nombre = nombre;
	}
	
	public String toString(){
		return nombre;
	}
}
